查看原文
其他

python操作Oracle数据库,你学会了吗?

黄伟呢 数据分析与统计学之美 2023-05-04

1. 准备工作

首先,你必须安装好Oracle数据库。Oracle数据库的安装并不是那么容易,大家可以去找一个安装教程,慢慢研究。

其次,你既然用Python操作Oracle,你必须要安装Python吧。Python的安装过程较为简单。但是有一点需要注意:一定要安装64位的Python,不要使用32位的。

最后,也是最复杂的一步。我们需要进行instantclient的下载安装和环境配置,它是oracle数据库的客户端,这个最好也是下载64位的。

2. instantclient的安装与配置

1)instantclient的下载地址

在进行instantclient的安装与配置之前,我先提供给大家一个下载链接,供大家下载,我们直接下载像11或者12这样的高版本,即可。

instantclient的下载地址:http://suo.im/5Dlqrr

2)instantclient的安装

① 直接解压instantclient安装包;

② 解压后的文件位置,不要随意放置;

我们需要将instantclient安装包,解压后得到的文件夹,放置在Oracle安装目录下的product的直接字目录下。

3)instantclient的环境配置

① 按照图中操作,完成环境变量的配置;

② 将其解压目录下的oraociei11.dll、oraocci11.dll、oci.dll文件复制到python安装目录的Lib/site-packages文件夹下;

instantclient安装包解压后的文件夹:

python安装目录下的Lib/site-packages文件夹:

3. 其他需要特别注意的点

1)解决中文乱码问题

当使用Python读取到Oracle数据库中的某张表,如果该表中存在中文,会出现中文乱码的问题。因此需要设置NLS_LANG环境变量,来解决这个问题,下面提供了两种方式。

① 打开CMD黑窗口,输入以下命令;

 C:\Users\AA>set nls_lang=SIMPLIFIED CHINESE_CHINA.ZHS16GBK

② 直接在写代码的时候,输入以下命令;

import os
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'

注意: 上述两种方式书写命令的位置不同,不要弄错了。其次,上述设置NLS_LANG环境变量的方式,仅对当前窗口有效。其实,我们也可以永久修改NLS_LANG环境变量,但是请不要这么做。

2)关于cx_Oracle驱动包的安装,需要注意的问题

cx_Oracle是Python操作Oracle数据库,需要使用的驱动包。类似于Python操作MySQL使用的pymysql驱动包。

对于我来说,我直接使用下面这个命令,就安装成功:

pip insatll cx_Oracle

如果你的系统环境,导致安装失败,我这里提供两个链接,供你下载和学习:

cx_Oracle驱动包的下载:http://suo.im/6fGFSR

cx_Oracle安装教程:http://suo.im/5DlvxT

4. Python与Oracle交互操作

其实Python操作Oracle数据库,和Python操作MySQL数据库,基本上都是一样的道理,一通百通。我之前已经写了一个Python操作MySQL数据库的详细教程,下面提供给大家这个链接。

Python操作MySQL数据库:http://suo.im/6fGJhl

1)Python链接Oracle服务器的3种方式

① 用户名、密码和监听写在一起

import cx_Oracle
db = cx_Oracle.connect('scott/a123456@DESKTOP-V4LKB10:1521/orcl')

② 用户名、密码和监听分开写

import cx_Oracle
db = cx_Oracle.connect("scott","a123456","192.168.2.1:1521/orcl")

③ 配置监听并连接

import cx_Oracle
moniter = cx_Oracle.makedsn('192.168.2.1',1521,'orcl')
db = cx_Oracle.connect('scott','a123456',moniter)

2)Python怎么获取Oracle中的数据(查)

数据分析师日常工作用到最多的就是“查”,因此我们只讲述怎么查数据。关于其它的增删改操作,都是类似于MySQL,这里就不详细说明。

① fetchone():一次获取一条记录;

import cx_Oracle
# 注意:一定要加下面这两行代码,负责会中文乱码;
import os
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'

db = cx_Oracle.connect("scott","a123456","192.168.2.1:1521/orcl")
cursor = db.cursor()

cursor.execute('select count(*) from emp1')
aa = cursor.fetchone()
print(aa)
cursor.execute('select ename,deptno,sal from emp1')     
for i in range(aa[0]):
    a,b,c = cursor.fetchone()
    d = "我的名字叫{},所在部门是{},工资是{}美元".format(a,b,c)
    display(d)
db.close()

截取部分结果如下:

② fetchall():一次获取所有记录;

import cx_Oracle
# 注意:一定要加下面这两行代码,负责会中文乱码;
import os
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'

db = cx_Oracle.connect("scott","a123456","192.168.2.1:1521/orcl")
cursor = db.cursor()

cursor.execute('select ename,deptno,sal from emp1')    
aa = cursor.fetchall()
# print(aa)
for a,b,c in aa:
    d = "我的名字叫{},所在部门是{},工资是{}美元".format(a,b,c)
    display(d)
db.close()

截取部分结果如下:

③ 使用pandas中的read_sql()方法,将提取到的数据直接转化为DataFrame进行操作;

import cx_Oracle
import pandas as pd
import os
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'

db = cx_Oracle.connect("scott","a123456","192.168.2.1:1521/orcl")
cursor = db.cursor()

df1 = pd.read_sql("select * from emp where deptno=20",db)
display(df1)

df2 = pd.read_sql("select * from emp where deptno=30",db)
display(df2)

结果如下:


关注微信公众号『数据分析与统计学之美』,后台回复"入群" 拉你进群哦,气氛很好滴呀!


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存